package rsj.api.contract.entity;

import com.alibaba.fastjson.annotation.JSONField;
import common.exec.RsjIllegalArgueException;
import common.statusenum.BillingEnum;
import common.statusenum.ServiceStatusEnum;
import common.statusenum.StatusEnum;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import rsj.db.dbutils.UniqueID;
import rsj.table.SYS_ORGPTYPE;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 合同
 *
 * @author yuanqinglong
 * @since 2021/7/15 11:21
 */
@Data
public class Contract {

    /**
     * 合同id
     */
    private String orgpId;
    /**
     * 机构id
     */
    @NotBlank(message = "机构id不可为空")
    private String orgpOrgId;
    /**
     * 接口编号（，拼接）
     */
    @NotBlank(message = "接口编号不可为空")
    private String orgpProdUid;
    /**
     * 产品id
     */
    @NotBlank(message = "接口id不可为空")
    private String orgpProdId;
    /**
     * 接口名称
     */
    @NotBlank(message = "接口名称不可为空")
    private String orgpProdName;
    /**
     * 1试用，2购买，3申请
     */
    private String orgpType;
    /**
     * 计费方式：1单条，2包量，3包企业数
     */
    @NotBlank(message = "财务方式不可为空")
    private String orgpBillmethod;
    /**
     * 操作人
     */
    @NotBlank(message = "操作人不可为空")
    private String orgpOperson;
    /**
     * 购买量
     */
    private Integer orgpBuyamount;
    /**
     * 生效日期
     */
    @NotNull(message = "生效时间不可为空")
    @JSONField(format = "yyyy-MM-dd")
    private LocalDate orgpCtime;
    /**
     * 到期日期
     */
    @NotNull(message = "到期时间不可为空")
    @JSONField(format = "yyyy-MM-dd")
    private LocalDate orgpEndtime;

    /**
     * 接口计费方式（prodUid#1）
     */
    @NotBlank(message = "接口计费方式不可为空")
    private String orgpProdCharge;
    /**
     * 充值时间
     */
    private LocalDateTime orgpRechargetime;
    /**
     * 合同时间
     */
    private LocalDate orgpContractime;
    /**
     * 更新时间
     */
    private LocalDateTime orgpUtime;
    /**
     * 使用状态
     */
    private String orgpStatus;
    /**
     * 合同状态
     */
    private String orgpOrgpstatus;
    /**
     * 已用量
     */
    private Integer orgpUseamount;
    /**
     * 剩余量
     */
    private Integer orgpRemaining;
    /**
     * 剩余天数
     */
    private Integer remainingDays;

    /**
     * 业务合同编号
     */
    private String orgpBusId;
    /**
     * 上游使用量
     */
    private String statUpUseamount;



    /**
     * 初始化属性
     */
    public void initializeAddProperties() {
        this.detectPurchases();
        orgpId = String.valueOf(UniqueID.generateId());
        orgpUtime = LocalDateTime.now();
        orgpContractime = LocalDate.now();
        orgpRechargetime = LocalDateTime.now();
        orgpOrgpstatus = StatusEnum.YES.getCode();
        orgpStatus = ServiceStatusEnum.NOT_ACTIVE_CODE;
    }


    /**
     * 检测购买
     */
    public void detectPurchases() {
        switch (orgpBillmethod) {
            case BillingEnum.SINGLE_BILLING_CODE:
                orgpType = SYS_ORGPTYPE.Orgp_Type_Collect;
                orgpBuyamount = 0;
                break;
            case BillingEnum.COMBINATION_BILLING_CODE:
            case BillingEnum.ENTERPRISE_BILLING_CODE:
                this.checkThePurchaseAmount();
                break;
            default:
                throw new RsjIllegalArgueException("不支持的计费类型！");
        }
    }


    /**
     * 检查购买数量
     */
    private void checkThePurchaseAmount() {
        if (StringUtils.isBlank(orgpType)) {
            throw new RsjIllegalArgueException("购买类型不可为空");
        }
        if (Objects.isNull(orgpBuyamount)) {
            throw new RsjIllegalArgueException("购买量不可为空");
        }
    }



}
